import ApiFetchers from "@/apis/api_fetchers"
import { createLogger } from "@/utils/logger"
import { useAtom } from "jotai"
import cloneDeep from "lodash/cloneDeep"
import { useCallback, useMemo } from "react"
import { initUserInfo, userInfoAtom, userInfoLoadingAtom } from "./atom"
import { getToken } from "@/utils/cached"

const logger = createLogger("useUserInfo")

/**
 * @description 提供全局用户信息的读取、更新、清除、获取等操作
 * 封装了 Jotai 状态和远程获取逻辑，并带有登录状态判断和加载状态
 */
export const useUserInfo = () => {
    // 用户信息全局状态（使用 atomWithStorage 存储）
    const [userInfo, setUserInfo] = useAtom(userInfoAtom)

    // 获取用户信息加载状态（用于 loading UI）
    const [loading, setLoading] = useAtom(userInfoLoadingAtom)

    /**
     * @description 登录状态判断
     * 用户名存在即视为已登录，可根据业务需求改为 token 等方式
     */
    const isLogin = useMemo(() => !!userInfo.uid, [userInfo])

    /**
     * @description 清除用户信息（如退出登录、请求失败）
     */
    const clearUserInfo = useCallback(() => {
        setUserInfo(cloneDeep(initUserInfo))
    }, [setUserInfo])

    /**
     * @description 获取最新用户信息（通常在登录成功或页面刷新时调用）
     * 自动设置 loading 状态，失败时清空用户信息
     */
    const getUserInfo = useCallback(async () => {
        const token = getToken()
        if (!token?.accessToken) {
            clearUserInfo()
            return
        }
        try {
            setLoading(true)
            const info = await ApiFetchers.refGetProfile()
            if (info) {
                setUserInfo(info)
                logger.debug("UserProfile", info)
            }
        } catch (err) {
            logger.debug("Failed to fetch user info:", err)
            clearUserInfo()
        } finally {
            setLoading(false)
        }
    }, [setUserInfo, clearUserInfo, setLoading])

    /**
     * @returns 封装的用户信息管理工具集合
     */
    return {
        userInfo, // 当前用户信息
        isLogin, // 是否已登录
        loading, // 是否正在加载用户信息
        setUserInfo, // 手动设置用户信息（如注册/更新用户信息场景）
        clearUserInfo, // 清空用户信息（如登出）
        getUserInfo, // 从后端拉取用户信息
    }
}
